package com.komeri.komeriapl;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import android.app.Activity;

/**
 * スタティック定时器、スクリーンのプリント頻度
 * @author Liu Mingjia
 * */
public final class InactivityTimer {

  private static final int INACTIVITY_DELAY_SECONDS = 5 * 60;

  /**
   * 時間により、任務を支配する。唯一のスレッドがあるスレッドプールを創建する。
   * Single Thread Scheduled Pool 
   */
  private final ScheduledExecutorService inactivityTimer =
          Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory());
  
  private final Activity activity;
  
  /**未来の予定*/
  private ScheduledFuture<?> inactivityFuture = null;

  public InactivityTimer(Activity activity) {
	  
      this.activity = activity;
    
      onActivity();
  }

  /**
   * ScheduledFuture<?>のオブジェクトを初期化する。
   * */
  public void onActivity() {
	  
      cancel();
    
      inactivityFuture = inactivityTimer.schedule(new FinishListener(activity),
    		  INACTIVITY_DELAY_SECONDS,TimeUnit.SECONDS);
  }

  private void cancel() {
	  
    if (inactivityFuture != null) {
    	
        inactivityFuture.cancel(true);
      
        inactivityFuture = null;
      
    }
  }

  /**
   * スレッドを閉じる
   * */
  public void shutdown() {
	  
      cancel();
    
      inactivityTimer.shutdown();
  }

  /**
   * デーモンスレッド、ユーザが使わないと自動的にスレッドを閉じる。
   * */
  private static final class DaemonThreadFactory implements ThreadFactory {
	  
      public Thread newThread(Runnable runnable) {
    	
          Thread thread = new Thread(runnable);
      
          thread.setDaemon(true);
      
          return thread;
    }
  }

}
